home *** CD-ROM | disk | FTP | other *** search
- /*************************************************************************************************
- *
- *
- * MacZoop - "the framework for the rest of us"
- *
- *
- *
- * ZHandleStream.cpp -- a stream using Handle storage
- *
- *
- *
- *
- *
- * © 1998, Graham Cox
- *
- *
- *
- *
- *************************************************************************************************/
-
-
- #include "ZHandleStream.h"
- #include "ZErrors.h"
-
-
- /*-------------------------------*** CONSTRUCTOR ***---------------------------------*/
-
- ZHandleStream::ZHandleStream( Handle aHandle, Boolean becomeOwner )
- : ZStream()
- {
- FailNILParam( aHandle );
-
- h = aHandle;
- hState = HGetState( h );
-
- ownsHandle = becomeOwner;
- }
-
-
- /*-------------------------------*** CONSTRUCTOR ***---------------------------------*/
-
- ZHandleStream::ZHandleStream()
- : ZStream()
- {
- FailNIL( h = NewHandle( 0 ));
- hState = HGetState( h );
-
- ownsHandle = TRUE;
- }
-
-
- /*--------------------------------*** DESTRUCTOR ***---------------------------------*/
-
- ZHandleStream::~ZHandleStream()
- {
- HSetState( h, hState );
-
- if ( ownsHandle )
- DisposeHandle( h );
- }
-
-
- /*-----------------------------------*** PUTTO ***------------------------------------*/
- /*
- write data to stream storage (handle)
- ----------------------------------------------------------------------------------------*/
-
- void ZHandleStream::PutTo( void* data, long dataLen )
- {
- long hLen = GetHandleSize( h );
-
- if (( mark + dataLen ) > hLen )
- {
- // need to extend handle for this data
-
- SetHandleSize( h, mark + dataLen );
- FailMemError();
- }
-
- HLock( h );
-
- Ptr p = *h + mark;
-
- BlockMoveData((Ptr) data, p, dataLen );
- HSetState( h, hState );
-
- mark += dataLen;
- }
-
-
- /*----------------------------------*** GETFROM ***-----------------------------------*/
- /*
- read data from stream storage (handle)
- ----------------------------------------------------------------------------------------*/
-
- void ZHandleStream::GetFrom( void* data, long* dataLen )
- {
- long hLen = GetHandleSize( h );
-
- // see if there's enough data in the handle to satisfy the request:
-
- if (( mark + *dataLen ) > hLen )
- {
- *dataLen = hLen - mark;
- mark = hLen;
- FailOSErr( kNoMoreDataInStreamErr );
- }
-
- HLock( h );
-
- Ptr p = *h + mark;
-
- BlockMoveData( p, (Ptr) data, *dataLen );
- HSetState( h, hState );
-
- mark += *dataLen;
- }
-